package Desastres;

import java.util.Observable;

import Excepciones.FueraDeLimites;
import MapaStuff.Hectarea;
import MapaStuff.Mapa;
import Ubicacion.Direccion;
import Ubicacion.Este;
import Ubicacion.Norte;
import Ubicacion.Oeste;
import Ubicacion.Punto;
import Ubicacion.Sur;

public class Terremoto extends Observable{

		private Hectarea hectareaCentral = null;
	
	
	public void crearSismoEn(Punto puntoDelTerreno) throws FueraDeLimites{
		hectareaCentral = Mapa.darMapa().darHectarea(puntoDelTerreno);
		hectareaCentral.daniarConstruccion(100);
		daniarHectareasEnDireccion(new Este(),98.5,hectareaCentral);
		daniarHectareasEnDireccion(new Oeste(),98.5,hectareaCentral);
		recorrerHectareasYDaniar(new Norte());
		recorrerHectareasYDaniar(new Sur());
		
		setChanged();
		notifyObservers();
	}

	private void recorrerHectareasYDaniar(Direccion direccion) {
		try {
			Hectarea hectareaActual = direccion.hectareaSiguiente(hectareaCentral);
			double danioInicial = 98.5;
			
			while (danioInicial>0){
				hectareaActual.daniarConstruccion((int)danioInicial);
				daniarHectareasEnDireccion(new Este(), danioInicial,hectareaActual);
				daniarHectareasEnDireccion(new Oeste(), danioInicial,hectareaActual);
				hectareaActual = direccion.hectareaSiguiente(hectareaActual);
				danioInicial -= 1.5;
			}
			
		} catch (FueraDeLimites e) {
			return;
		}
		
	}

	private void daniarHectareasEnDireccion(Direccion direccion, double danioInicial, Hectarea hectareaInicial) {
		Hectarea hectareaADaniar = hectareaInicial;
		double danioSecundario = danioInicial;
		
		while (danioSecundario>0){
			try {
				hectareaADaniar = direccion.hectareaSiguiente(hectareaADaniar);
			} catch (FueraDeLimites e) {
				return;
			}
			hectareaADaniar.daniarConstruccion((int) danioSecundario );
			danioSecundario = danioSecundario - 1.5;
		}		
	}

	public Hectarea hectareaDelTerremoto(){
		return hectareaCentral;
	}
	
	public void pasarTemblor(){
		hectareaCentral = null;
		setChanged();
		notifyObservers();
	}
}
